<?php


class Solution {
    function numSimilarGroups($strs) {
        $map=[];  //记录字符串分组的二维数组
        $len=strlen($strs[0]);
        foreach ($strs as $str){
            $sign=-1;   //找到分组 记录下标
            foreach ($map as $k=>$item){
                foreach ($item as $s){
                    if($this->isSimilar($s,$str,$len)){  //两个字符串相似 开始分组操作
                        if($sign<0){        //没有被分组过  加入分组
                            $map[$k][]=$str;
                            $sign=$k;
                        }else{              //已经被分组过  合并组
                            $map[$sign]=array_merge($map[$sign],$map[$k]);
                            unset($map[$k]);
                        }
                        break;
                    }
                }
            }
            if($sign<0) $map[]=[$str];   //没有被分组  则新建一组
        }
        return count($map);
    }
    //判断两个字符串是否相似
    function isSimilar($word1,$word2,$len){
        $first=0;  //找到两个字符串第一个不相同的字符位置
        while ($word1[$first]==$word2[$first] && $first<$len) $first++;
        if($first==$len) return true;
        $word1First=$word1[$first];
        $word2First=$word2[$first];
        $second=$first+1;
        while ($word1[$second]==$word2[$second]) $second++;  //找到两个字符串第二个不同的字符位置
        if($word1[$second]==$word2First && $word2[$second]==$word1First){
            $word1[$second]=$word1First;  //交换字符
            $word1[$first]=$word2First;
            return $word1===$word2;   //判断交换字符后 两个字符串是否相等 相等则符合相似的定义
        }
        return false;  //第二位置不相同的两个字符 不是由第一个位置不相同的两个字符构成 则必定不相似
    }
}


?>